// DO NOT MODIFY, generate automatically.
import request from './request'

function buildFormData(data) {
  const form = new FormData()
  for (const k in data) {
    const v = data[k]
    if (v instanceof File) {
      form.append(k, v, v.name)
    } else if (v instanceof Blob) {
      form.append(k, v, k)
    } else {
      form.append(k, v)
    }
  }
  return form
}

/**
 * 获取登录公钥
 */
export function getPublickey() {
  return request({
    url: `/api/v1/auth/publickey`,
    method: 'get'
  })
}

/**
 * 获取当前登录的用户
 */
export function getCurrentUser() {
  return request({
    url: `/api/v1/auth/current`,
    method: 'get'
  })
}

/**
 * 登出
 */
export function logout() {
  return request({
    url: `/api/v1/auth/logout`,
    method: 'get'
  })
}

/**
 * 登录
 *
 * @param {*} username 用户名
 * @param {*} password 加密后的密码
 * @param {*} enkey 加密后的key
 * @param {*} iv 随机向量
 */
export function login(username, { password, enkey, iv }) {
  return request({
    url: `/api/v1/auth/login`,
    method: 'post',
    data: {
      username,
      password,
      enkey,
      iv
    }
  })
}

/**
 * 上传用户头像
 *
 * @param {*} image 图片，图片尺寸最大512x512
 */
export function uploadAvatar(image) {
  return request({
    url: `/api/v1/auth/avatar`,
    method: 'post',
    data: buildFormData({
      image
    })
  })
}

/**
 * 修改个人用户密码
 *
 * @param {*} password 加密后的密码
 * @param {*} enkey 加密后的key
 * @param {*} iv 随机向量
 */
export function changeMyPassword({ password, enkey, iv }) {
  return request({
    url: `/api/v1/auth/password`,
    method: 'put',
    data: {
      password,
      enkey,
      iv
    }
  })
}

/**
 * 获取所有用户或者按条件筛选用户
 *
 * @param {*} username 用户名
 * @param {*} realname 真实姓名
 * @param {*} role 权限角色(编号)
 * @param {*} is_superadmin 是否是超级管理员
 * @param {*} is_active 是否可用
 * @param {*} page 页码
 */
export function queryUsers({ username, realname, role, is_superadmin, is_active }, page = undefined) {
  return request({
    url: `/api/v1/users`,
    method: 'get',
    params: {
      username,
      realname,
      role,
      is_superadmin,
      is_active,
      page
    }
  })
}

/**
 * 获取指定用户
 *
 * @param {*} id 用户ID
 */
export function getUser(id) {
  return request({
    url: `/api/v1/users/${id}`,
    method: 'get'
  })
}

/**
 * 创建用户
 *
 * @param {*} username 用户名
 * @param {*} realname 真实姓名
 * @param {*} password 加密后的密码
 * @param {*} enkey 加密后的key
 * @param {*} iv 随机向量
 * @param {*} role 权限角色(编号)，默认普通权限
 * @param {*} is_active 是否可用，默认可用
 */
export function createUser(username, realname, { password, enkey, iv, role, is_active }) {
  return request({
    url: `/api/v1/users`,
    method: 'post',
    data: {
      username,
      realname,
      password,
      enkey,
      iv,
      role,
      is_active
    }
  })
}

/**
 * 修改用户信息
 *
 * @param {*} id 用户ID
 * @param {*} username 用户名
 * @param {*} realname 真实姓名
 * @param {*} role 权限角色(编号)，默认普通权限
 * @param {*} is_active 是否可用，默认可用
 */
export function editUser(id, { username, realname, role, is_active }) {
  return request({
    url: `/api/v1/users/${id}`,
    method: 'put',
    data: {
      username,
      realname,
      role,
      is_active
    }
  })
}

/**
 * 修改用户密码
 *
 * @param {*} id 用户ID
 * @param {*} password 加密后的密码
 * @param {*} enkey 加密后的key
 * @param {*} iv 随机向量
 */
export function changeUserPassword(id, { password, enkey, iv }) {
  return request({
    url: `/api/v1/users/${id}/password`,
    method: 'put',
    data: {
      password,
      enkey,
      iv
    }
  })
}

/**
 * 删除指定用户
 *
 * @param {*} id 用户ID
 */
export function removeUser(id) {
  return request({
    url: `/api/v1/users/${id}`,
    method: 'delete'
  })
}

/**
 * 获取所有权限
 */
export function getAllPermissions() {
  return request({
    url: `/api/v1/users/permissions`,
    method: 'get'
  })
}

/**
 * 获取所有角色
 */
export function getAllRoles() {
  return request({
    url: `/api/v1/users/roles`,
    method: 'get'
  })
}

/**
 * 题目类型一致性检查
 *
 * @param {*} max_level 类型树最大高度，默认2
 */
export function checkConsistent(max_level = undefined) {
  return request({
    url: `/api/v1/types/consistent`,
    method: 'get',
    params: {
      max_level
    }
  })
}

/**
 * 创建新题目类型
 *
 * @param {*} type_name 类型名称
 * @param {*} parent_type_id 父类型ID，0表示根类型
 * @param {*} output_code 输出编号
 */
export function createType(type_name, parent_type_id, output_code = undefined) {
  return request({
    url: `/api/v1/types`,
    method: 'post',
    data: {
      type_name,
      parent_type_id,
      output_code
    }
  })
}

/**
 * 编辑题目类型
 *
 * @param {*} id 类型ID
 * @param {*} type_name 类型名称
 * @param {*} parent_type_id 父类型ID，0表示根类型
 * @param {*} output_code 输出编号
 */
export function editType(id, type_name, parent_type_id, output_code = undefined) {
  return request({
    url: `/api/v1/types/${id}`,
    method: 'put',
    data: {
      type_name,
      parent_type_id,
      output_code
    }
  })
}

/**
 * 题目类型一致性修复
 *
 * @param {*} max_level 类型树最大高度，默认2
 */
export function fixConsistent(max_level = undefined) {
  return request({
    url: `/api/v1/types/consistent`,
    method: 'put',
    data: {
      max_level
    }
  })
}

/**
 * 删除题目类型
 *
 * @param {*} id 类型ID
 */
export function removeType(id) {
  return request({
    url: `/api/v1/types/${id}`,
    method: 'delete'
  })
}

/**
 * 获取所有的题目类型
 */
export function getAllTypes() {
  return request({
    url: `/api/v1/types`,
    method: 'get'
  })
}

/**
 * 根据参数查询题目，分页
 *
 * @param {*} status 题目状态，null则查询全部
 * @param {*} style 题目形式，0选择，1填空
 * @param {*} content 题目内容，将在题干、选项、答案中搜索
 * @param {*} is_me 是否只查询自己题目
 * @param {*} page 页码
 */
export function queryQuestions({ status, style, content, is_me }, page = undefined) {
  return request({
    url: `/api/v1/questions`,
    method: 'get',
    params: {
      status,
      style,
      content,
      is_me,
      page
    }
  })
}

/**
 * 根据ID获取题目，不存在时返回null
 *
 * @param {*} id 题目ID
 */
export function getQuestion(id) {
  return request({
    url: `/api/v1/questions/${id}`,
    method: 'get'
  })
}

/**
 * 创建题目
 *
 * @param {*} type_id 题目类型ID
 * @param {*} style 题目形式，0选择，1填空
 * @param {*} text 题干
 * @param {*} options 选项
 * @param {*} answer 答案
 */
export function createQuestion(type_id, style, { text, options, answer }) {
  return request({
    url: `/api/v1/questions`,
    method: 'post',
    data: {
      type_id,
      style,
      text,
      options,
      answer
    }
  })
}

/**
 * 上传图片
 *
 * @param {*} id 题目ID
 * @param {*} image 图片，图片尺寸最大512x340
 * @param {*} auto_clip 是否自动剪裁，默认否
 */
export function uploadImage(id, { image }, auto_clip = undefined) {
  return request({
    url: `/api/v1/questions/${id}/image`,
    method: 'post',
    data: buildFormData({
      image,
      auto_clip
    })
  })
}

/**
 * 修改题目信息
 *
 * @param {*} id 题目ID
 * @param {*} type_id 题目类型ID
 * @param {*} style 题目形式，0选择，1填空
 * @param {*} text 题干
 * @param {*} options 选项
 * @param {*} answer 答案
 * @param {*} commit 审题员编辑记录
 */
export function editQuestion(id, { type_id, style, text, options, answer, commit }) {
  return request({
    url: `/api/v1/questions/${id}`,
    method: 'put',
    data: {
      type_id,
      style,
      text,
      options,
      answer,
      commit
    }
  })
}

/**
 * 删除指定资源
 *
 * @param {*} id id
 */
export function removeQuestion(id) {
  return request({
    url: `/api/v1/questions/${id}`,
    method: 'delete'
  })
}

/**
 * 分页获取某题目留言
 *
 * @param {*} qid 题目ID
 * @param {*} page 页码
 */
export function fetchQuestionCommentMessages(qid, page = undefined) {
  return request({
    url: `/api/v1/questions/${qid}/comments`,
    method: 'get',
    params: {
      page
    }
  })
}

/**
 * 给题目留言
 *
 * @param {*} qid 题目ID
 * @param {*} request_check 是否请求重审
 * @param {*} content 留言内容
 */
export function createQuestionCommentMessage(qid, content, { request_check }) {
  return request({
    url: `/api/v1/questions/${qid}/comments`,
    method: 'post',
    data: {
      request_check,
      content
    }
  })
}

/**
 * 修改留言
 *
 * @param {*} qid 题目ID
 * @param {*} id 留言ID
 * @param {*} content 留言内容
 */
export function editQuestionCommentMessage(qid, id, content) {
  return request({
    url: `/api/v1/questions/${qid}/comments/${id}`,
    method: 'put',
    data: {
      content
    }
  })
}

/**
 * 删除指定资源
 *
 * @param {*} qid qid
 * @param {*} id id
 */
export function removeQuestionCommentMessage(qid, id) {
  return request({
    url: `/api/v1/questions/${qid}/comments/${id}`,
    method: 'delete'
  })
}

/**
 * 随机返回一个未审核的题目
 */
export function getRandomUncheckedQuestion() {
  return request({
    url: `/api/v1/questions/next-check`,
    method: 'get'
  })
}

/**
 * 查询题目，附带当前用户做题结果
 *
 * @param {*} page 页码
 */
export function queryQuestionsWithExam(page) {
  return request({
    url: `/api/v1/questions/query-exam`,
    method: 'get',
    params: {
      page
    }
  })
}

/**
 * 获取下一个当前用户未做过的题目
 */
export function getNextUnexamedQuestion() {
  return request({
    url: `/api/v1/questions/next-exam`,
    method: 'get'
  })
}

/**
 * 获取题目统计数据
 */
export function getQuestionStatistics() {
  return request({
    url: `/api/v1/questions/statistics`,
    method: 'get'
  })
}

/**
 * 按作者统计题库数据
 *
 * @param {*} begin 开始时间
 * @param {*} end 结束时间
 */
export function getQuestionStatisticsByAuthor(begin, end) {
  return request({
    url: `/api/v1/questions/statistics_author`,
    method: 'get',
    params: {
      begin,
      end
    }
  })
}

/**
 * 审核题目
 *
 * @param {*} id 题目ID
 * @param {*} status 题目审核结果
 * @param {*} reason 拒绝理由
 */
export function checkQuestion(id, status, reason) {
  return request({
    url: `/api/v1/questions/${id}/check`,
    method: 'put',
    data: {
      status,
      reason
    }
  })
}

/**
 * 做题
 *
 * @param {*} id 题目ID
 * @param {*} result 受试结果
 */
export function examQuestion(id, result) {
  return request({
    url: `/api/v1/questions/${id}/exam`,
    method: 'put',
    data: {
      result
    }
  })
}

/**
 * 获取当前用户总消息条数和已读消息条数
 */
export function getPrivateMessageCount() {
  return request({
    url: `/api/v1/messages/private/count`,
    method: 'get'
  })
}

/**
 * 获取所有联系人
 */
export function getAllContatcs() {
  return request({
    url: `/api/v1/messages/private/contacts`,
    method: 'get'
  })
}

/**
 * 翻页获取消息列表
 *
 * @param {*} page 页码
 */
export function fetchChatList(page = undefined) {
  return request({
    url: `/api/v1/messages/private/chat-list`,
    method: 'get',
    params: {
      page
    }
  })
}

/**
 * 获取和某一个人的聊天消息
 *
 * @param {*} offset 开始位置
 * @param {*} limit 获取个数
 * @param {*} right_id right_id
 */
export function fetchPrivateMessages(right_id, offset = undefined, limit = undefined) {
  return request({
    url: `/api/v1/messages/private/chat-list/${right_id}`,
    method: 'get',
    params: {
      offset,
      limit
    }
  })
}

/**
 * 按ID获取私信，标记为已读
 *
 * @param {*} id 私信ID
 */
export function getPrivateMessages(id) {
  return request({
    url: `/api/v1/messages/private/${id}`,
    method: 'get'
  })
}

/**
 * 发送私信
 *
 * @param {*} to_id 接收者用户ID
 * @param {*} content 消息内容
 */
export function createPrivateMessage(to_id, content) {
  return request({
    url: `/api/v1/messages/private`,
    method: 'post',
    data: {
      to_id,
      content
    }
  })
}

/**
 * 撤回消息
 *
 * @param {*} id ID
 */
export function removePrivateMessage(id) {
  return request({
    url: `/api/v1/messages/private/${id}`,
    method: 'delete'
  })
}

/**
 * 查看留言板
 *
 * @param {*} page 页码
 */
export function fetchBoardMessages(page = undefined) {
  return request({
    url: `/api/v1/messages/board`,
    method: 'get',
    params: {
      page
    }
  })
}

/**
 * 发布留言
 *
 * @param {*} content 留言内容
 */
export function createBoardMessage(content) {
  return request({
    url: `/api/v1/messages/board`,
    method: 'post',
    data: {
      content
    }
  })
}

/**
 * 编辑留言
 *
 * @param {*} id 留言ID
 * @param {*} content 留言内容
 */
export function editBoardMessage(id, content) {
  return request({
    url: `/api/v1/messages/board/${id}`,
    method: 'put',
    data: {
      content
    }
  })
}

/**
 * 删除留言
 *
 * @param {*} id ID
 */
export function removeBoardMessage(id) {
  return request({
    url: `/api/v1/messages/board/${id}`,
    method: 'delete'
  })
}

/**
 * 获取所有需要重审的题目留言
 *
 * @param {*} is_rechecked 是否已经审核过，默认不限
 * @param {*} page 页码
 */
export function fetchRecheckCommentMessages({ is_rechecked }, page = undefined) {
  return request({
    url: `/api/v1/messages/recheck-comments`,
    method: 'get',
    params: {
      is_rechecked,
      page
    }
  })
}

/**
 * 修改是否已经重审标记
 *
 * @param {*} id 留言ID
 * @param {*} is_rechecked 已复审？
 */
export function editRecheckCommentMessage(id, is_rechecked) {
  return request({
    url: `/api/v1/messages/recheck-comments/${id}`,
    method: 'put',
    data: {
      is_rechecked
    }
  })
}

/**
 * 发表公告
 *
 * @param {*} content 公告内容
 */
export function createNoticeMessage(content) {
  return request({
    url: `/api/v1/messages/notice`,
    method: 'post',
    data: {
      content
    }
  })
}

/**
 * 编辑公告
 *
 * @param {*} id 公告ID
 * @param {*} content 公告内容
 */
export function editNoticeMessage(id, content) {
  return request({
    url: `/api/v1/messages/notice/${id}`,
    method: 'put',
    data: {
      content
    }
  })
}

/**
 * 删除公告
 *
 * @param {*} id ID
 */
export function removeNoticeMessage(id) {
  return request({
    url: `/api/v1/messages/notice/${id}`,
    method: 'delete'
  })
}

/**
 * 获取所有公告
 */
export function getAllNoticeMessages() {
  return request({
    url: `/api/v1/messages/notice`,
    method: 'get'
  })
}

/**
 * 获取所有导出记录
 */
export function getAllLogs() {
  return request({
    url: `/api/v1/export`,
    method: 'get'
  })
}

/**
 * 下载ZIP文件，请不要使用接口调用，请在新页面打开
 *
 * @param {*} code ZIP编号
 */
export function downloadZip(code) {
  return request({
    url: `/api/v1/export/${code}`,
    method: 'get'
  })
}

/**
 * 抽取题目
 *
 * @param {*} extract_type 抽取类型，1随机，2顺序，必选
 * @param {*} output_type 导出类型，1为智力方舟格式，2为抢答题+智力方舟格式，类型2时强制非图片题
 * @param {*} total 抽取题目总数，必选
 * @param {*} comment 导出注释，用于方便自己查看，建议不要留空
 * @param {*} style 题目形式，0选择，1填空，null则忽略
 * @param {*} has_image 是否由图片题，null则忽略
 * @param {*} offset 开始位置，默认为0
 */
export function extractQuestions(extract_type, output_type, total, { comment, style, has_image, offset }) {
  return request({
    url: `/api/v1/export`,
    method: 'post',
    data: {
      extract_type,
      output_type,
      total,
      comment,
      style,
      has_image,
      offset
    }
  })
}

/**
 * 撤销某次导出，将题目标记撤回到未导出状态
 *
 * @param {*} id 记录号ID
 */
export function withdrawExtract(id) {
  return request({
    url: `/api/v1/export/${id}`,
    method: 'delete'
  })
}

/**
 * 查看服务器版本
 */
export function version() {
  return request({
    url: `/api/v1/version`,
    method: 'get'
  })
}
